// BIMFACE 模型文件管理-Files相关接口
// https://bimface.com/docs/file-management/v1/api-reference/createVersionUsingPOST.html

import  bimfaceHttp from '@/api/Bimface';
import { FileItemModel } from './model/projectModel';
import { DownloadSourceFileModel, PolicyModel, RemoveFileItmesModel } from './model/fileItemModel';

enum Api {
  Folders = '/bdfs/data/v1/projects',
}

/**
 * @abstract: 上传版本文件
 * @description: 在指定文件项中上传新版本文件，上传后自动更新为文件项的当前版本。单个文件项最多支持100个文件版本。
 */
export function uploadVersionFile(
  projectId: string,
  params: {
    fileItemId?: string;
    path?: string;
    name?: string;
    length?: number;
    sourceId?: string;
  },
  file: File,
) {
  return bimfaceHttp.post<FileItemModel>({
    url: Api.Folders + `/${projectId}/files`,
    params: params,
    data: file,
  });
}

/**
 * @abstract: 获取新版本直传的policy凭证
 * @description: BIMFACE使用了分布式对象存储来存储用户上传的模型、图纸文件。通过新版本直传接口，开发者在申请到一个Policy凭证后可以直接上传新版本到BIMFACE后台的分布式存储系统。通过该接口获取到新版本直传的policy凭证后，可以直接在前端使用表单上传方式将文件上传到BIMFACE的对象存储上，具体见根据policy凭证在web端上传文件 (opens new window)。
 */
export function getCurrentVersionPolicy(
  projectId: string,
  params: {
    fileItemId?: string;
    path?: string;
    name?: string;
    maxLength?: number;
    sourceId?: string;
  },
) {
  return bimfaceHttp.get<PolicyModel>({
    url: Api.Folders + `/${projectId}/files/policy`,
    params: params,
  });
}

export async function updateNewVersionByPolicy(
  projectId,
  params,
  file,
  onUploadProgress?: (progressEvent) => void,
) {
  const res = await getCurrentVersionPolicy(projectId, params);
  const url = res.data.host;
  const data = {
    name: params.name,
    key: res.data.objectKey,
    policy: res.data.policy,
    OSSAccessKeyId: res.data.accessId,
    callback: res.data.callbackBody,
    signature: res.data.signature,
    success_action_status: 200,
  };
  return bimfaceHttp.uploadFile({ url, timeout: 3 * 60 * 1000, onUploadProgress }, { data, file });
}

/**
 * @abstract: 获取指定版本文件信息
 * @description: 根据文件ID获取指定版本的文件信息。
 */
export function getSpecifiedFileInfo(
  projectId: string,
  fileId: string,
  params: {
    withFileSource?: boolean;
  },
) {
  return bimfaceHttp.get<FileItemModel>({
    url: Api.Folders + `/${projectId}/files/${fileId}/meta`,
    params: params,
  });
}

/**
 * @abstract: 下载指定版本文件
 * @description: 通过该接口可获取指定版本文件的下载地址，下载地址有效时间为60分钟，可通过参数修改有效期。
 */
export function downloadSepcifiedFileItem(
  projectId: string,
  fileId: string,
  params: {
    expireTime?: string;
  },
) {
  return bimfaceHttp.get<DownloadSourceFileModel>({
    url: Api.Folders + `/${projectId}/files/${fileId}/downloadUrl`,
    params: params,
  });
}

/**
 * @abstract: 删除指定版本文件
 * @description: 支持批量删除多个版本的文件。
 */
export function deleteSpecifiedFileItem(
  projectId: string,
  data: {
    fileIds?: string[];
  },
) {
  return bimfaceHttp.delete<RemoveFileItmesModel>({
    url: Api.Folders + `/${projectId}/files`,
    data: data,
  });
}
